/**
 * 果果乐园项目中公共JS，上线后可能会把3个js合并
 */


//====================== 华丽的分隔线 ===========================//

/**
 * 简单实现一个ajax方法，后期如果使用jQuery可以直接用$.ajax替换
 * @param settings
 * @returns 
 */
function ajax(settings)
{
	/**
	 * 默认ajax参数设置
	 */
	var s = defaultAjaxSettings = 
	{
		url: '',
		type: 'GET', // 默认GET
		async: true, // 默认异步
		cache: null, // 设置游览器缓存时间
		data: null,
		dataType: null, // 预期服务器返回的数据类型
		contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
		success: function(data, textStatus, xhr){ console.log(data); },
		error: function(xhr, textStatus, errorThrown){ console.error(xhr); }
	};
	for(var i in settings)
	{
		if(settings[i] !== undefined) s[i] = settings[i];
	}
	var xhr = null;
	// Firefox，Opera 8.0+，Safari，Chrome等浏览器
	if(window.XMLHttpRequest) xhr = new XMLHttpRequest();
	// 如果是IE（IE5.5以及以后版本可以使用）
	if(window.ActiveXObject) xhr = new ActiveXObject('Microsoft.XMLHTTP');
	if(!xhr)
	{
		console.error('抱歉，您的浏览器不支持ajax！'); return;
	}
	xhr.onreadystatechange = function()
	{
		if(xhr.readyState == 4) // 4代表数据发送完毕
		{
			var rsp = xhr.responseText || xhr.responseXML;//服务器端响应
			//200到300代表访问服务器成功，304代表没做修改访问的是缓存，0为访问的本地
			if((xhr.status >= 200 && xhr.status <300) || xhr.status == 304|| xhr.status == 0 )
			{
				var contentType = xhr.getResponseHeader('Content-Type'); // 获取服务器返回的内容类型
				if(s.dataType == 'json' || (contentType && contentType.indexOf('application/json')>=0))
				{
					try { rsp = eval('(' + rsp + ')'); }
					catch(e)
					{
						console.error('服务器返回的内容不是json格式！');
						console.error(e);
					}
				}
				Epg.debug(rsp);
				s.success.apply(window, [rsp, '', xhr]);
			}
			else
			{
				s.error.apply(window, [xhr]);
			}
		}
	};
	xhr.open(s.type, s.url, s.async);
	var sendStr = null;
	if(s.cache !== null)
	{
		xhr.setRequestHeader("Cache-Control", "max-age=" + s.cache);
	}
	if(s.type === 'POST' && s.data)
	{
		xhr.setRequestHeader('Content-Type', s.contentType);
		if(typeof s.data == 'string') sendStr = s.data;
		else if(typeof s.data === 'object')
		{
			sendStr = '';
			for(var i in s.data) sendStr += (sendStr === '' ? '' : '&') + i + '=' + s.data[i];
		}
	}
	xhr.send(sendStr);
	return xhr;
};

Epg.ajax = ajax;

//专门为JSON对象转换为JSON字符串处理方法
function quote(string) {
	var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
	var meta = {    
        "\b": "\\b", "\t": "\\t",
        "\n": "\\n", "\f": "\\f",
        "\r": "\\r", "\"": "\\\"",
        "\\": "\\\\"
    };
	rx_escapable.lastIndex = 0;
    return rx_escapable.test(string)
        ? "\"" + string.replace(rx_escapable, function (a) {
            var c = meta[a];
            return typeof c === "string"
                ? c
                : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
        }) + "\""
        : "\"" + string + "\"";
}

/**
 * 请求API数据，API必须接受跨域请求
 * @param url API地址，不包括前缀，如“epg/get”
 * @param data 请求数据，json对象 或者 json字符串 格式均可
 * @param success 请求成功时执行的回调函数
 * @param error 失败后执行的回调函数，不传的话默认会有处理
 */
Epg.postAPI = function(url, data, success, error)
{
	if(CONFIG.API_URL === 'json')
	{
		url = url + (url === 'epg/get' ? '_' + data.code : '');
		url = CONFIG.CONTEXT_PATH+'api/'+url+'.json';
	}else if(/^http:\/\//.test(url))
	{
		url = url;
	}else
	{
		url = CONFIG.API_URL+url;
	}
	var requestType="POST";
	if(url.indexOf("config.json") > 0){
		requestType="GET";
	}
	if(typeof data === 'object') {
		var jStr = [];
		for(var item in data) {
			jStr.push("\""+item+"\":"+quote(data[item]));
		}
		data = "{" + jStr.join(",") + "}";
	}
	ajax(
	{
		url: url,
		type: requestType,
		data: data,
		contentType: 'application/json',
		dataType: 'json',
		success: success,
		error: error || function()
		{
			console.error('ajax请求错误！');
			Epg.tip('系统繁忙，请求数据失败！');
		}
	});
	
};


(function()
{
	
	function getColumnCode()
	{
		var pathname = location.pathname;
		var filename = pathname.substr(pathname.lastIndexOf('/')+1).replace(/\..*$/g, '');
		return columnCode = CONFIG.COLUMN_CODE || filename;
	}
	
	function getSourceType()
	{
		var temp = location.pathname.split('/');
		var targetType = (temp && temp.length > 3) ? temp[2] : 'column';
		return targetType;
	}
	
	/**
	 * 获取当前页面路径，CONFIG.CURRENT_URI通常类似于“column/fav/fav.jsp”这样的格式
	 */
	Epg.getCurrentURI = function()
	{
		var currentURI = CONFIG.CURRENT_URI || (location.pathname + location.search);
		if(CONFIG.EXT === '.html') currentURI = currentURI.replace(/\.jsp/g, '.html');
		// 如果不是从项目名开始，自动追加
		if(!/^\//g.test(currentURI)) currentURI = CONFIG.CONTEXT_PATH + currentURI;
		return currentURI + (currentURI.indexOf('?') > 0 ? '' : '?1=1');
	};
	
	/**
	 * 通用的多层级栏目跳转方法，只有当有“原路返回”的需求时才需要用到此方法，否则，普通的 location.href 即可<br>
	 * 如果没有定义 CONFIG.CURRENT_URI，那么直接用当前URL做返回地址
	 * 如果没有定义 CONFIG.COLUMN_CODE，那么直接把当前文件名（去掉后缀）作栏目关键字
	 * @param url 要跳转的URL地址，必须从WebContent下一级目录开始，如：column/order/order.jsp
	 */
	Epg.go = function(url)
	{
		if(CONFIG.EXT === '.html') url = url.replace(/\.jsp/g, '.html');
		var backURI = Epg.getCurrentURI() + '&f=' + Epg.btn.current.id;
		if(Epg.scrollScreen && Epg.scrollScreen.config.enable) backURI += ('&scrollTop='+Epg.scrollScreen.config.scrollTop);
		if(Epg.scroll && Epg.scroll.config.enable) backURI += ('&scrollLeft='+Epg.scroll.config.scrollLeft);
		//var backUriList = JSON.parse(unescape(Epg.cookie.get('back_uri_list', '[]')));
		var backUriList = eval("("+unescape(Epg.cookie.get('back_uri_list', '[]'))+")");
		backUriList.push(backURI);
		//Epg.cookie.set('back_uri_list', escape(JSON.stringify(backUriList)));
		var jStr = "";
		for(var i = 0, length = backUriList.length; i < length; i++){
			jStr += '"'+backUriList[i]+'",';
		}
		jStr = "[" + jStr.slice(0, -1) + "]";
		Epg.cookie.set('back_uri_list', escape(jStr));
		location.href = CONFIG.CONTEXT_PATH + url + (url.indexOf('?') > 0 ? '&' : '?') + 'source=' + getColumnCode();
	};

	/**
	 * 获取上一层返回地址，本方法必须配合Epg.go()一起使用
	 */
	Epg.getBackURI = function()
	{
		//var backUriList = JSON.parse(unescape(Epg.cookie.get('back_uri_list', '[]')));
		var backUriList = eval("("+unescape(Epg.cookie.get('back_uri_list', '[]'))+")");
		// var backURI = backUriList.pop() || (CONFIG.CONTEXT_PATH + 'home' + CONFIG.EXT);
		var backURI = backUriList.pop() || (CONFIG.CONTEXT_PATH+'column/iptv_home/iptv_home'+CONFIG.EXT);
		backURI = backURI + (backURI.indexOf('?') > 0 ? '&' : '?') + 'source=' + getColumnCode();
		//Epg.cookie.set('back_uri_list', escape(JSON.stringify(backUriList)));
		var jStr = "";
		for(var i = 0, length = backUriList.length; i < length; i++){
			jStr += '"'+backUriList[i]+'",';
		}
		jStr = "[" + jStr.slice(0, -1) + "]";
		Epg.cookie.set('back_uri_list', escape(jStr));
		return backURI;
	};

	/**
	 * 跳转到播放页面，只需要关心目标地址，无需关心返回
	 * @param url 从WebContent目录开始的地址，如：column/mp/mp.jsp?xxx=xxx
	 */
	Epg.goMP = function(url)
	{
		if(CONFIG.EXT === '.html') url = url.replace(/\.jsp/g, '.html');
		var playEndURI = Epg.getCurrentURI() + '&f=' + Epg.btn.current.id;
		if(Epg.scrollScreen && Epg.scrollScreen.config.enable) playEndURI += ('&scrollTop='+Epg.scrollScreen.config.scrollTop);
		Epg.cookie.set('play_end_uri', escape(playEndURI));
		location.href = CONFIG.CONTEXT_PATH + url + (url.indexOf('?') > 0 ? '&' : '?') + 'source=' + getColumnCode()+'&sourceType='+getSourceType();
	};

	/**
	 * 获取播放结束时返回的地址
	 * @return
	 */
	Epg.getPlayEndURI = function()
	{
		//var playEndURI = unescape(Epg.cookie.get('play_end_uri', CONFIG.CONTEXT_PATH + 'home' + CONFIG.EXT));
		var playEndURI = unescape(Epg.cookie.get('play_end_uri', CONFIG.CONTEXT_PATH+'column/iptv_home/iptv_home'+CONFIG.EXT));
		return playEndURI + (playEndURI.indexOf('?') > 0 ? '&' : '?') + 'source=' + getColumnCode();
	};
})();


/**
 * 从URL中获取某个参数值
 * @param name 参数名称
 * @param defaultValue 默认值
 */
Epg.getParam = function(name, defaultValue)
{
	defaultValue = defaultValue === undefined ? '' : defaultValue;
	var result = new RegExp('(\\?|&)'+name+'=(.*?)(&|$)', 'g').exec(location.search);
	return result ? result[2] : defaultValue;
};
/**
 * 从URL中获取某个参数值
 * @param name 参数名称
 * @param defaultValue 默认值
 */
Epg.getParamInt = function(name, defaultValue)
{
	defaultValue = defaultValue === undefined ? 0 : defaultValue;
	return parseInt(Epg.getParam(name, defaultValue));
};

/**
 * 将日期格式化成指定格式的字符串
 * @param fmt 要格式化目标字符串，示例：yyyy-MM-dd www HH:mm:ss
 * @param date 要格式化的日期，不传时默认当前时间，可以是时间戳
 * @returns 返回格式化后的日期字符串
 */
Epg.formatDate = function(fmt, date)
{
	fmt = fmt || 'yyyy-MM-dd www HH:mm:ss:SSS';
	date = date === undefined ? new Date() : date;
	if(typeof date === 'number') date = new Date(date);
	var obj =
	{
		'y': date.getFullYear(), // 年份，注意必须用getFullYear
		'M': date.getMonth()+1, // 月份，注意是从0-11
		'd': date.getDate(), // 日期
		"q": Math.floor((date.getMonth()+3)/3), // 季度
		'w': date.getDay(), // 星期，注意是0-6
		'H': date.getHours(), // 24小时制
		'h': date.getHours()%12==0?12:date.getHours()%12, // 12小时制
		'm': date.getMinutes(), // 分钟
		's': date.getSeconds(), // 秒
		'S': date.getMilliseconds() // 毫秒
	};
	var week = ['天', '一', '二', '三', '四', '五', '六'];
	for(var i in obj)
	{
		fmt = fmt.replace(eval('/'+i+'+/g'), function( m )
		{
			var val = obj[i] + '';
			if(i == 'w') return (m.length>2?'星期':'周') + week[val];
			for(var j=0, len=val.length; j<m.length-len; j++) val = '0' + val;
			return m.length==1 ? val : val.substring(val.length - m.length);
		});
	}
	return fmt;
};

/*============================新增3个日志方法，区别于Epg.Log下面的那几个方法===============================*/
/**
 * 添加访问日志
 */
Epg.addAccessLog = function()
{
	// 如果配置了CONFIG.ADD_ACCESS_LOG为false，或者没有配置COLUMN_CODE，那么不添加访问日志
	if(CONFIG.ADD_ACCESS_LOG === false || !CONFIG.COLUMN_CODE) return;
	var temp = location.pathname.split('/');
	var targetType = (temp && temp.length > 3) ? temp[2] : 'column';
	var postData = 
	{
		'userid': Epg.cookie.get('userid'),//用户ID
		'role': Epg.cookie.get('role'),//角色名
		'orderType': Epg.cookie.get('orderType'),//订购类型：free、day、month、year
		'city': Epg.cookie.get('city'),//城市code
		'entry': Epg.cookie.get('entry'),//入口字段，后来增加的
		'carrier': CONFIG.CARRIER,//运营商
		'appVersion': CONFIG.APP_VERSION,//版本
		'platform': Epg.cookie.get('CHANNEL_CODE'),//平台，OTT版本使用channelCode代替
		'integralStrategy': '',//积分策略，垃圾字段
		'cachable': true,//是否使用缓存，默认使用
		'source': Epg.getParam('source', ''),//来源页面
		'target': CONFIG.COLUMN_CODE,//目标，即当前页面
		'targetType': targetType,//当前页面类型
		'apkVersion': Epg.cookie.get('APK_VERSION'),//apk版本
		'version': CONFIG.VERSION//epg api版本
	};
	Epg.postAPI('access/add', postData, function(data)
	{
		Epg.debug('添加访问日志成功！');
	});
};

/**
 * 更新上一次点播日志
 */
Epg.addVodLog = function(source, sourceType, videoCode)
{
	// method 可能是：playFromSeries、playFromProgram、playVideo
	var metadataType = method.replace(/^play(?:From)?(\w)(.*)$/g, function(m, $1, $2)
	{
		return $1.toLowerCase()+$2;
	});
	var postData = 
	{
		'userid': Epg.cookie.get('userid'),//用户ID
		'role': Epg.cookie.get('role'),//角色名
		'orderType': Epg.cookie.get('orderType'),//订购类型：free、day、month、year
		'city': Epg.cookie.get('city'),//城市code
		'entry': Epg.cookie.get('entry'),//入口字段，后来增加的
		'carrier': CONFIG.CARRIER,//运营商
		'appVersion': CONFIG.APP_VERSION,//版本
		'platform': Epg.cookie.get('CHANNEL_CODE'),//平台
		'integralStrategy': '',//积分策略，垃圾字段
		'cachable': true,//是否使用缓存，默认使用
		'source': source,//来源页面
		'sourceType': sourceType,//来源页面类型
		'code': videoCode, // 视频code
		'metadataType': metadataType, // 元数据类型，如program、series、video
		'vodMode': Epg.getParam('vodMode', 'active'), // 点播模式，主动还是被动
		'searchLogId': -1, // 搜索日志ID
		'apkVersion': Epg.cookie.get('APK_VERSION'),//apk版本
		'version': CONFIG.VERSION//epg api版本
	};
	Epg.postAPI('vod/add', postData, function(data)
	{
		Epg.debug('添加点播日志成功！');
	});
};

/**
 * 更新上一次点播日志，退出播放页面才需要调用此方法
 */
Epg.updateLastVodLog = function(callback)
{
	Epg.postAPI('vod/update-last', {userid: Epg.cookie.get('userid')}, function(data)
	{
		Epg.debug('添加访问日志成功！');
		if(callback) callback();
	});
};

Epg.jsTime = function()
{
	return new Date();
};

/**
 * 订购结果弹出页面
 */
Epg.addOrderDialog = function()
{	
	buttons.push({id:'order_ok', action:'orderOk()', focusClass:'peru_s', left:'order_baby', autoDirGroup:false, code:"back"});
	buttons.push({id:'order_baby', action:'orderOk()', focusClass:'peru_s', right:'order_ok', autoDirGroup:false, code:""});

	G("order_dialog").innerHTML = '<div id="order_title"></div>'+
		'<div id="order_ok_title">快快去完善个人信息,有惊喜哦!</div>'+
		'<div id="order_baby" class="common_btn_green">完善信息</div>'+
		'<div id="order_ok" class="common_btn_green">不了,谢谢</div>';
};
/**
 * 剧集订购或者是专辑订购弹出页面
 */
Epg.addSeriesDialog = function()
{
	buttons.push({id:'order_series_img',focusClass:'peru', right:'order_series_price_img', focusHandler:Epg.focusHandler, blurHandler:Epg.blurHandler,autoDirGroup:false});
	buttons.push({id:'order_series_price_img', action:'seriesOrder()',focusClass:'package', left:'order_series_img', right:'more_order_img',autoDirGroup:false});
	buttons.push({id:'more_order_img', action:'allOrder()',focusClass:'package', left: 'order_series_price_img',autoDirGroup:false});
	
	G("order_series").innerHTML = '<div id="order_series_title"></div>'+
	'<div id="order_series_img">'+
		'<div id="order_series_img_txt" class="album_txt"></div>'+
	'</div>'+
	'<div id="order_series_price">'+			
	'</div>'+
	'<div id="order_series_price_img"></div>'+
	'<div id="more_order">'+			
	'</div>'+
	'<div id="more_order_img"></div>';
};
/**
 * 标题获得焦点后滚动
 */
Epg.focusHandler = function()
{
	Epg.marquee.start();
};
/**
 * 标题失去焦点后去掉滚动
 */
Epg.blurHandler = function()
{
	Epg.marquee.stop();
};

/*============================新增3个日志方法，区别于Epg.Log下面的那几个方法===============================*/


/** 给每个页面自动创建一个默认的A标签并聚焦，解决电视上光标聚焦问题 */
(function()
{
	var aimg = document.createElement('img');
	aimg.setAttribute('src', CONFIG.SPACER);
	var atag = document.createElement('a');
	atag.id = 'default_link';
	atag.setAttribute('href', '#');
	atag.appendChild(aimg);
	document.body.appendChild(atag);
	document.getElementById('default_link').focus();//聚焦默认的A标签
})();

// 此参数为true时，整个页面会共用一个光标，主要目的是方便实现按钮动画，
// 如果不希望开启此功能，可以在页面自行将此参数设置false即可，
// 可以针对具体按钮设置shareCursor:false 来单独禁用某个按钮上的此功能
//Epg.btn.config.shareCursor = true;
setTimeout(Epg.addAccessLog, 2000); // 2秒钟后添加访问日志